package com.campus.help.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.campus.help.entity.LaborType;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 劳务类型 Mapper 接口
 *
 * @author campus-help
 * @since 2025-09-18
 */
@Mapper
public interface LaborTypeMapper extends BaseMapper<LaborType> {

    /**
     * 查询启用状态的劳务类型列表（按排序值排序）
     *
     * @return 启用的劳务类型列表
     */
    List<LaborType> selectEnabledTypes();

    /**
     * 根据类型名称查询（排除指定ID）
     *
     * @param typeName 类型名称
     * @param excludeId 排除的ID（用于更新时检查重名）
     * @return 劳务类型
     */
    LaborType selectByTypeName(@Param("typeName") String typeName, @Param("excludeId") Long excludeId);

    /**
     * 查询系统默认类型列表
     *
     * @return 系统默认类型列表
     */
    List<LaborType> selectDefaultTypes();

    /**
     * 获取下一个排序值
     *
     * @return 下一个排序值
     */
    Integer getNextSortOrder();

    /**
     * 更新排序值
     *
     * @param typeId 类型ID
     * @param sortOrder 新的排序值
     * @return 更新行数
     */
    int updateSortOrder(@Param("typeId") Long typeId, @Param("sortOrder") Integer sortOrder);

    /**
     * 分页查询劳务类型
     */
    IPage<LaborType> selectLaborTypePage(Page<LaborType> page, 
                                        @Param("typeName") String typeName, 
                                        @Param("status") Integer status);

    /**
     * 批量更新状态
     */
    int batchUpdateStatus(@Param("ids") List<Long> ids, 
                         @Param("status") Integer status, 
                         @Param("updateBy") Long updateBy);

    /**
     * 批量更新排序
     */
    int batchUpdateSortOrder(@Param("list") List<Map<String, Object>> list);

    /**
     * 统计劳务类型数量
     */
    Map<String, Object> getLaborTypeStats();

    /**
     * 查询某个类型关联的劳务数量
     */
    Integer countLaborsByTypeId(@Param("typeId") Long typeId);

    /**
     * 重置排序值
     */
    int resetSortOrder();
}
